home *** CD-ROM | disk | FTP | other *** search
- #define OFFSET(type, field) ((int) &((type *) 0)->field)
- #define STACKOFFSET(type, A6field, field) ((int) &((type *) 0)->field - (int) &((type *) 0)->A6field)
-
- typedef struct IUStrData {
- short curChar;
- short mapChar;
- short decChar;
- char bufChar;
- char justAfter;
- char ignChar;
- char noFetch;
- short strCnt;
- long strPtr;
- } IUStrData;
-
- typedef struct IUSortFrame {
- short firstRunLen;
- short flag;
- char pad[14];
- char weakMag;
- char msLock;
- char weakEq;
- char wantMag;
- IUStrData bInfo;
- IUStrData aInfo;
- long oldA6;
- long returnPtr;
- short bStrLen;
- short aStrLen;
- long bStrText;
- long aStrText;
- } IUSortFrame;
-
- void Init (void);
- void Fetch (void);
- short RunLen (char *ptr, short remainingLen);
- unsigned short FixupSecondChar (IUSortFrame *sortFrame, char * remStrA, char * remStrB, short lenStrA, short lenStrB);
-
- void main (void) {
- asm {
- bra Init
- bra Fetch
- dc.l 'NSrt' // OSType identifier
- dc.l 0 // OldInit offset 8
- dc.l 0 // OldFetch offset 12
- dc.l 0 // OldResourceSize offset 16
- }
- }
-
- void Init (void) {
- asm {
- move.w #0, STACKOFFSET(IUSortFrame, oldA6, flag) (a6);
-
- lea main,a0
- move.l 20(a0),d1
- move.l 12(a0), d0
- sub.l d1,a0
- add.l d0,a0
- jsr (a0)
- }
- }
-
- void Fetch (void) {
- asm {
- tst.w STACKOFFSET(IUSortFrame, oldA6, flag)(a6)
- bne @secondStr
-
- move.w IUStrData.strCnt(a2), d0
- add.w #1,d0
- move.w d0, -(a7)
- move.l IUStrData.strPtr(a2), -(a7)
-
- lea main,a0
- move.l 20(a0),d1
- move.l 16(a0), d0
- sub.l d1,a0
- add.l d0,a0
- jsr (a0)
-
- jsr RunLen
- add.l #6,a7
-
- move.w d0, STACKOFFSET(IUSortFrame, oldA6, firstRunLen) (a6)
- move.w #1, STACKOFFSET(IUSortFrame, oldA6, flag) (a6)
-
- @secondStr:
- move.w IUStrData.strCnt(a2), d0
- add.w #1,d0
- move.w d0, -(a7)
- move.l IUStrData.strPtr(a2), -(a7)
- jsr RunLen
- add.l #6,a7
-
- tst.w d0
- beq @oldFetch
-
- tst.w STACKOFFSET(IUSortFrame, oldA6, firstRunLen)(a6)
- beq @oldFetch
-
- cmp.w STACKOFFSET(IUSortFrame, oldA6, firstRunLen)(a6), d0
- beq @oldFetch
-
- blt @firstStrGreater
-
- move.w #0xFF00, d4
- rts
-
- @firstStrGreater:
-
- move.w #0x0000, d4
- rts
-
- @oldFetch:
-
- lea main,a0
- move.l 20(a0),d1
- move.l 16(a0), d0
- sub.l d1,a0
- add.l d0,a0
- jsr (a0)
-
- rts
- }
- }
-
- short RunLen (char *ptr, short remainingLen) {
- short runLen = 0;
- while ((remainingLen > 0) && (*ptr >= '0') && (*ptr <= '9')) {
- ++runLen;
- ++ptr;
- --remainingLen;
- }
-
- return runLen;
- }
-
- unsigned short FixupSecondChar (IUSortFrame *sortFrame, char * remStrA, char * remStrB, short lenStrA, short lenStrB) {
-
-
- }